<?php
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가

function mw_cash_membership_original_cash($mi_id) {
    global $mw_cash;

    $row1 = sql_fetch("select mi_cash, mi_day, ms_id from $mw_cash[membership_item_table] where mi_id = '$mi_id'"); // 현재
    $row2 = sql_fetch("select mi_cash, mi_day from $mw_cash[membership_item_table] where ms_id = '$row1[ms_id]' and mi_status = '1' order by mi_cash asc limit 1"); // 최저

    return @round($row2[mi_cash] * ($row1[mi_day] / $row2[mi_day]));
}

function mw_cash_membership_discount($mi_id) {
    global $mw_cash;

    $row1 = sql_fetch("select mi_cash, mi_day, ms_id from $mw_cash[membership_item_table] where mi_id = '$mi_id'"); // 현재
    $row2 = sql_fetch("select mi_cash, mi_day from $mw_cash[membership_item_table] where ms_id = '$row1[ms_id]' and mi_status = '1' order by mi_cash asc limit 1"); // 최저

    return 100-@round($row1[mi_cash] / ($row2[mi_cash] * ($row1[mi_day] / $row2[mi_day])) * 100);
}

// 2012-04-06 가장 비싼 멤버쉽 아이콘만 표시
function mw_cash_membership_icon($mb_id)
{
    global $mw_cash, $g4, $is_admin;

    $icon = '';
    $icon_old = '';
    $cash = -1;

    $sql = "select * from $mw_cash[membership_log_table]
                where mb_id = '$mb_id' and '$g4[time_ymdhis]' <= ml_edate group by ms_id, ml_day order by ml_cash desc";
    $qry = sql_query($sql);
    while ($row = sql_fetch_array($qry))
    {
        $row2 = sql_fetch("select * from $mw_cash[membership_item_table] where ms_id = '$row[ms_id]' and mi_day = '$row[ml_day]' order by mi_datetime desc limit 1");

        if ($row2[mi_cash] == '') continue;

        if (!$mw_cash[cf_membership_icon]) {
            if ($row2[mi_cash] < $cash) continue;
            if ($icon)
                $icon_old = $icon;
            $icon = '';
        }

        $icon_path = "$mw_cash[icon_path]/i$row2[mi_id]";
        $tooltip_path = "$mw_cash[icon_path]/i{$row2[mi_id]}_tooltip";

        if ($row2[mi_url])
            $url = $row2[mi_url];
        else
            $url = "$g4[path]/plugin/cybercash/index.php";

        if (file_exists($icon_path)) {
            if (!file_exists($tooltip_path)) {
                $icon.= "<a href=\"$url\" class=\"tooltip\" title=\"$row2[mi_tooltip_text]\">";
                $icon.= "<img src=\"$icon_path\" align=\"absmiddle\"></a>&nbsp;";
            } else {
                $icon.= "<a href=\"$url\" class=\"screenshot\" rel=\"$tooltip_path\">";
                $icon.= "<img src=\"$icon_path\" align=\"absmiddle\"></a>&nbsp;";
            }
        } else {
            $row3 = sql_fetch("select * from $mw_cash[membership_table] where ms_id = '$row[ms_id]'");

            $icon_path = "$mw_cash[icon_path]/$row[ms_id]";
            $tooltip_path = "$mw_cash[icon_path]/{$row[ms_id]}_tooltip";

            if ($row3[ms_url])
                $url = $row3[ms_url];
            else
                $url = "$g4[path]/plugin/cybercash/index.php";

            if (file_exists($icon_path)) {
                if (!file_exists($tooltip_path)) {
                    $icon.= "<a href=\"$url\" class=\"tooltip\" title=\"$row3[ms_tooltip_text]\">";
                    $icon.= "<img src=\"$icon_path\" align=\"absmiddle\"></a>&nbsp;";
                } else {
                    $icon.= "<a href=\"$url\" class=\"screenshot\" rel=\"$tooltip_path\">";
                    $icon.= "<img src=\"$icon_path\" align=\"absmiddle\"></a>&nbsp;";
                }
            }
            else {
                if ($icon_old)
                    $icon = $icon_old;
                continue;
            }
        }
        $cash = $row2[mi_cash];
    }

    return $icon;
}


function mw_get_paytype($paytype) {
    switch ($paytype) {
	case "account": $paytype = "무통장"; break;
	case "cyber": $paytype = "가상계좌"; break;
	case "card": $paytype = "신용카드"; break;
	case "bank": $paytype = "계좌이체"; break;
	case "hp": $paytype = "핸드폰"; break;
	case "paypal": $paytype = "페이팔"; break;
	default : $paytype = "";
    }
    return $paytype;
}

// 가용포인트 계산
function mw_get_point_to_cash_possible($mb_id='')
{
    global $g4, $member, $mw_cash;

    if (!$mb_id)
        $mb_id = $member[mb_id];

    $sdatetime = date("Y-m-d H:i:s", $g4[server_time] - ($mw_cash[cf_possible_day] * 86400));

    // 5일 전까지 + 포인트
    $sql = "select sum(po_point) as p_point from $g4[point_table] where mb_id = '$mb_id' and po_datetime < '$sdatetime' and po_point > 0";
    $row = sql_fetch($sql);

    // 지금까지 - 포인트
    $sql2 = "select sum(po_point) as m_point from $g4[point_table] where mb_id = '$mb_id' and po_point < 0";
    $row2 = sql_fetch($sql2);

    // 합산
    $possible_point = $row[p_point] + $row2[m_point];

    if ($possible_point < 0)
        $possible_point = 0;

    return $possible_point;
}

function mw_get_payment($payment, $tax) {
    global $mw_cash;

    if ($tax) { // 부가세 별도
	$payment = $payment * 1.1;
    } else {
	$payment = $payment;
    }
    return $payment;
}

// 캐쉬->결제금액 계산
function mw_cash_to_payment($cash, $tax) {
    global $mw_cash;

    if ($tax) { // 부가세 별도
	$cash_price = $mw_cash[cf_cash_price] * 1.1;
	$payment = $cash * $cash_price;
    } else {
	$payment = $cash * $mw_cash[cf_cash_price];
    }
    return $payment;
}

// 결제금액->캐쉬 계산
function mw_payment_to_cash($payment, $tax) {
    global $mw_cash;

    if ($tax) { // 부가세 별도
	$cash_price = $mw_cash[cf_cash_price] * 1.1;
	$cash = @($payment / $cash_price);
    } else {
	$cash = @($payment / $mw_cash[cf_cash_price]);
    }
    return $cash;
}

// 캐쉬 충전
function mw_cash_charge($mb_id, $cl_cash, $cl_content, $cl_payment, $cl_paytype, $cl_paylog="", $cl_admin_memo="", $cl_status="1", $point_save="1", $rel_table='', $rel_id='') {
    global $g4, $mw_cash, $_SERVER, $is_paypal;

    if ($is_paypal) {
        $cash_price = $mw_cash[cf_paypal_dollar];
        $cash_tax = '';
    } else {
        $cash_price = $mw_cash[cf_cash_price];
        $cash_tax = $mw_cash[cf_tax];
    }

    $sql = "insert into $mw_cash[cash_list_table]
		    set mb_id = '$mb_id',
                        rel_table = '$rel_table',
                        rel_id = '$rel_id',
			cl_cash_price = '$cash_price',
			cl_cash = '$cl_cash',
			cl_tax = '$cash_tax',
			cl_content = '$cl_content',
			cl_payment = '$cl_payment',
			cl_paytype = '$cl_paytype',
			cl_paylog = '$cl_paylog',
			cl_admin_memo = '$cl_admin_memo',
			cl_datetime = '$g4[time_ymdhis]',
			cl_ip = '$_SERVER[REMOTE_ADDR]',
			cl_agent = '$_SERVER[HTTP_USER_AGENT]',
			cl_status = '$cl_status'";
    $qry = sql_query($sql);
    $cl_id = mysql_insert_id();

    if ($cl_status == "1" && $point_save)
        mw_cash_point_save($cl_id);

    mw_cash_resum($mb_id);

    return $cl_id;
} 

// 포인트->캐쉬변환
function mw_point_to_cash($mb_id, $cash) { 
    global $g4, $mw_cash, $_SERVER;

    if ($cash < 0) alert("잘못된 값입니다.");

    // 가용포인트
    $ps_point = mw_get_point_to_cash_possible();

    // 차감 포인트
    $sub_point = $cash * $mw_cash[cf_cash_point];

    if ($sub_point > $ps_point) alert("변환범위를 벗어났습니다.");

    // 충전 내용
    $content = "[충전] 포인트(".number_format($sub_point)."점)→{$mw_cash[cf_cash_name]}(".number_format($cash)."{$mw_cash[cf_cash_unit]})";

    // 회원정보
    $mb = get_member($mb_id, "mb_point");

    // log
    $paylog = "결제전 포인트 : ".number_format($mb[mb_point])." 점\n결제후 포인트 : ". number_format($mb[mb_point] - $sub_point) . " 점";

    // 캐쉬 충전
    $cl_id = mw_cash_charge($mb_id, $cash, $content, $sub_point, "포인트", $paylog);

    insert_point($mb_id, $sub_point * -1, $content, "@point-to-cash", $cl_id, "충전");

    return $cl_id;
}

// 캐쉬->포인트
function mw_cash_to_point($mb_id, $cash) { 
    global $g4, $mw_cash, $_SERVER;

    // 증가 포인트
    $add_point = $cash * $mw_cash[cf_cash_point];

    // 충전 내용
    $content = "[충전] {$mw_cash[cf_cash_name]}(".number_format($cash)."{$mw_cash[cf_cash_unit]})→포인트(".number_format($add_point)."점)";

    // 회원정보
    $mb = get_member($mb_id, "mb_point");

    // log
    $paylog = "충전전 포인트 : ".number_format($mb[mb_point])." 점\n충전후 포인트 : ". number_format($mb[mb_point] + $add_point) . " 점";

    // 캐쉬차감
    $cl_id = mw_buy_contents2($mb_id, $cash, $content);

    // 포인트 충전
    insert_point($mb_id, $add_point, $content, "@cash-to-point", $cl_id, "충전");

    return $cl_id;
}

// cl_id 얻기
function mw_get_cl_id($mb_id, $rel_table, $rel_id) {
    global $mw_cash;

    $sql = "select cl_id from $mw_cash[cash_list_table] where mb_id = '$mb_id' and rel_table = '$rel_table' and rel_id = '$rel_id'";
    $row = sql_fetch($sql);

    return $row[cl_id];
}

// 캐쉬 삭제 
function mw_cash_delete($cl_id) {
    global $g4, $mw_cash;

    $sql = "select * from $mw_cash[cash_list_table] where cl_id = '$cl_id'";
    $row = sql_fetch($sql);

    //if (!$row) alert("삭제할 캐쉬 데이터가 존재하지 않습니다.");

    if ($row[cl_paytype] == "포인트") 
        delete_point($row[mb_id], "@point-to-cash", $row[cl_id], "충전");

    // 삭제
    sql_query("delete from $mw_cash[cash_list_table] where cl_id = '$cl_id'");

    // 적립포인트 삭제
    delete_point($row[mb_id], "@cash-save-point", $row[cl_id], "적립");
    delete_point($row[mb_id], "@cash-grade-point", $row[cl_id], "적립");

    // 파트너 수익쉐어 삭제
    if (function_exists("mw_partner_share_delete")) {
        mw_partner_share_delete($row);
    }

    mw_cash_resum($row[mb_id]);
}

// 캐쉬 사용
function mw_buy_contents($mb_id, $bo_table, $wr_id, $cl_domain="") {
    global $g4, $mw_cash, $mw_basic, $_SERVER;

    $write_table = $g4[write_prefix] . $bo_table;
    $sql = "select * from $write_table where wr_id = '$wr_id' and wr_is_comment = '0'";
    $row = sql_fetch($sql);
    if (!$row)
	alert("컨텐츠가 존재하지 않습니다.");

    if ($mw_cash[mb_cash] < $row[wr_contents_price])
	alert("보유하고 계신 $mw_cash[cf_cash_name] 부족합니다.");

    if ($cl_domain) $cl_domain = set_http($cl_domain);

    //if (mw_is_buy_contents($mb_id, $bo_table, $wr_id, $cl_domain)) alert("이미 구입하셨습니다.");

    $cash = $row[wr_contents_price] * -1;

    $sql = "insert into $mw_cash[cash_list_table]
	       set mb_id = '$mb_id',
		   rel_table = '$bo_table',
		   rel_id = '$wr_id',
		   rel_mb_id = '$row[mb_id]',
		   cl_domain = '$cl_domain',
		   cl_cash_price = '$mw_cash[cf_cash_price]',
		   cl_cash = '$cash',
		   cl_tax = '$mw_cash[cf_tax]',
		   cl_content = '[결제] " . get_text($row[wr_subject]) . "',
		   cl_ip = '$_SERVER[REMOTE_ADDR]',
		   cl_datetime = '$g4[time_ymdhis]',
		   cl_status = '1'";
    sql_query($sql);
    $cl_id = mysql_insert_id();

    mw_cash_resum($mb_id);

    // 업로더 적립
    if ($mw_basic[cf_contents_shop_uploader] && $mw_basic[cf_contents_shop_uploader_cash])
    {
        $content = "판매 수익금 적립 (".addslashes(htmlspecialchars($row[wr_subject])).")";
        $uploader_cash = round($row[wr_contents_price]*($mw_basic[cf_contents_shop_uploader_cash]/100));
        if ($uploader_cash)
            mw_cash_charge($row[mb_id], $uploader_cash, $content, 0, "판매수익금", 1, 0);
    }

    return $cl_id;
}

// 게시판 이외의 컨텐츠 구입
function mw_buy_contents2($mb_id, $cash, $content, $rel_table="", $rel_id="", $cl_domain="")
{
    global $g4, $mw_cash, $_SERVER;

    //if (!$cash) return;
    mw_cash_resum($mb_id);

    if ($cash < 0)
        alert("금액이 잘못되었습니다.");

    $row = sql_fetch("select * from $mw_cash[cash_table] where mb_id = '$mb_id'");
    if ($row[mb_cash] < $cash)
	alert("보유하고 계신 $mw_cash[cf_cash_name] 부족합니다.");

    $cash *= -1;

    /*
    if ($rel_table && $rel_id) {
        $sql = "select * from $mw_cash[cash_list_table] where mb_id = '$mb_id' and rel_table = '$rel_table' and rel_id = '$rel_id' ";
        if ($cl_domain)
            $sql.= " and cl_domain = '$cl_domain'";

        $row = sql_fetch($sql);
        if ($row) return;
    }
    */

    $sql = "insert into $mw_cash[cash_list_table]
	       set mb_id = '$mb_id',
		   rel_table = '$rel_table',
		   rel_id = '$rel_id',
		   rel_mb_id = '',
		   cl_domain = '$cl_domain',
		   cl_cash_price = '$mw_cash[cf_cash_price]',
		   cl_cash = '$cash',
		   cl_tax = '$mw_cash[cf_tax]',
		   cl_content = '[결제] " . get_text($content) . "',
		   cl_ip = '$_SERVER[REMOTE_ADDR]',
		   cl_datetime = '$g4[time_ymdhis]',
		   cl_status = '1'";
    sql_query($sql);
    $cl_id = mysql_insert_id();

    mw_cash_resum($mb_id);

    return $cl_id;
}

// 보유캐쉬계산
function mw_cash_resum($mb_id) {
    global $g4, $mw_cash;

    $row = sql_fetch("select sum(cl_cash) as cash from $mw_cash[cash_list_table] where mb_id = '$mb_id' and cl_status = '1'");
    $cash = $row[cash];

    $sql = "select * from $mw_cash[cash_table] where mb_id = '$mb_id'";
    $row = sql_fetch($sql);
    if ($row)
	sql_query("update $mw_cash[cash_table] set mb_cash = '$cash' where mb_id = '$mb_id'");
    else
	sql_query("insert into $mw_cash[cash_table] set mb_id = '$mb_id', mb_cash = '$cash'");

    return $cash;	
} 

// 구입여부
function mw_is_buy_contents($mb_id, $bo_table, $wr_id, $cl_domain="") {
    global $g4, $mw_cash;

    $ret = false;

    $sql = "select * from $g4[write_prefix]$bo_table where wr_id = '$wr_id'";
    $row = sql_fetch($sql);
    if ($row[wr_contents_price]) { // 가격이 있으면 검사
	$sql = " select * from $mw_cash[cash_list_table] where mb_id = '$mb_id' and cl_status = '1' and rel_table = '$bo_table' and rel_id = '$wr_id' ";
	if ($cl_domain)
	    $sql .= " and cl_domain = '$cl_domain'";
        $sql .= " order by cl_datetime desc limit 1 ";

	$row = sql_fetch($sql);

	if ($row) $ret = $row;
    } else {
	$ret = true; // 가격이 없으면 구입한걸로 처리
    }

    return $ret;
}

// pg 통한 결제 성공
function mw_cash_pg_complete($mb_id, $cl_id, $log="", $payment=0) {
    global $g4, $mw_cash;

    ob_start();
    print_r($log);
    $log = ob_get_contents();
    ob_end_clean();

    $log = addslashes($log);

    $row = sql_fetch("select * from $mw_cash[cash_list_table] where cl_id = '$cl_id'");
    if (!$row)
        die("결제정보가 없습니다.");

    $payment = 0;

    if ($mw_cash[cf_pg] == 'lgdacom' || $mw_cash[cf_pg] == 'xpay') {
        global $amount;
        $payment = $amount;
    }

    if ($mw_cash[cf_pg] == 'kcp') {
        global $amount;
        $payment = $amount;
    }

    if ($mw_cash[cf_pg] == 'allthegate') {
        global $agspay;
        $payment = $agspay->GetResult("rAmt");
    }

    if ($mw_cash[cf_pg] == 'inipay') {
        global $inipay;
        $payment = $inipay->m_price;
    }

    global $is_paypal;
    if ($is_paypal) {
       global $payment_gross;
       $payment = $payment_gross;
    }

    if ($is_paypal) {
        if ($payment > 0 && $payment != $row[cl_payment])
            die("결제금액이 맞지 않습니다. 관리자에게 문의해주세요.");
    } else {
        if ($payment > 0 && mw_cash_to_payment($row[cl_cash], $mw_cash[cf_tax]) != $payment)
            die("결제금액이 맞지 않습니다. 관리자에게 문의해주세요.");
    }
        
    sql_query("update $mw_cash[cash_list_table] set cl_status = '1', cl_paylog = '$log' where cl_id = '$cl_id' and mb_id = '$mb_id'");

    mw_cash_point_save($cl_id);

    // 파트너 수익쉐어
    if (function_exists("mw_partner_order_share")) {
        mw_partner_order_share($mb_id, $cl_id);
    }

    mw_cash_resum($mb_id);
}

// 포인트 적립
function mw_cash_point_save($cl_id) {
    global $g4, $mw_cash;

    if ($mw_cash[cf_point_save] < 1) return;

    $row = sql_fetch("select * from $mw_cash[cash_list_table] where cl_id = '$cl_id'");
    if ($row[cl_payment] <= 0) return;
    if ($row[cl_paytype] == "서비스" || $row[cl_paytype] == "포인트") return;

    $save = round((mw_cash_to_payment($row[cl_cash], 0) * ($mw_cash[cf_point_save]/100)));
    $point_content = "$mw_cash[cf_cash_name] ".number_format($row[cl_cash]);
    $point_content.= "$mw_cash[cf_cash_unit] 충전의 $mw_cash[cf_point_save]% 적립";
    insert_point($row[mb_id], $save, $point_content, "@cash-save-point", "$cl_id", "적립");

    $grade = mw_cash_grade($row['mb_id'], $cl_id);
    if ($grade['gd_point_save']) {
        $save = round((mw_cash_to_payment($row['cl_cash'], 0) * ($grade['gd_point_save']/100)));
        $point_content = "{$grade['gd_name']} 등급 추가 {$grade['gd_point_save']}% 적립";
        insert_point($row[mb_id], $save, $point_content, "@cash-grade-point", "$cl_id", "적립");
    }
}

function mw_cash_sms($cl_id) {
    global $g4, $mw_cash;

    $row = sql_fetch("select * from $mw_cash[cash_list_table] where cl_id = '$cl_id'");
    if (!$row)
	return false;

    if ($row[cl_paytype] == "포인트")
	return false;

    $mb = get_member($row[mb_id], "mb_name, mb_nick, mb_hp");

    if ($row[cl_paytype] == '페이팔') 
        $row[cl_payment] = number_format($row[cl_payment], 2)."$";
    else
        $row[cl_payment] = number_format($row[cl_payment])."원";

    $row[cl_cash] = number_format($row[cl_cash]);

    // 고객 통보
    if ($mw_cash[cf_sms]) {
	$msg = $mw_cash[cf_sms_content];
	$msg = str_replace("{캐쉬}", $mw_cash[cf_cash_name], $msg);
	$msg = str_replace("{충전수}", $row[cl_cash].$mw_cash[cf_cash_unit], $msg);
	$msg = str_replace("{이름}", $mb[mb_name], $msg);
	$msg = str_replace("{별명}", $mb[mb_nick], $msg);
	$msg = str_replace("{방법}", $row[cl_paytype], $msg);
	$msg = str_replace("{금액}원", "{금액}", $msg);
	$msg = str_replace("{금액}", $row[cl_payment], $msg);
	if (mw_cash_is_hp($mb[mb_hp]))
	    mw_cash_sms_send($mb[mb_hp], $mw_cash[cf_sms_return], $msg);
    }

    // 관리자 통보
    if ($mw_cash[cf_admin_sms]) {

        $cl_paytype = $row[cl_paytype];

        preg_match("/\[LGD_CARDINSTALLMONTH\] => ([0-9]+)?/i", $row['cl_paylog'], $match); 
        $card_install_month = (int)$match[1];

        if ($card_install_month) {
            $cl_paytype .= " {$card_install_month}개월";
        }

	$msg = $mw_cash[cf_admin_sms_content];
	$msg = str_replace("{캐쉬}", $mw_cash[cf_cash_name], $msg);
	$msg = str_replace("{충전수}", $row[cl_cash].$mw_cash[cf_cash_unit], $msg);
	$msg = str_replace("{이름}", $mb[mb_name], $msg);
	$msg = str_replace("{별명}", $mb[mb_nick], $msg);
	$msg = str_replace("{방법}", $cl_paytype, $msg);
	$msg = str_replace("{금액}원", "{금액}", $msg);
	$msg = str_replace("{금액}", $row[cl_payment], $msg);
	//if (mw_cash_is_hp($mw_cash[cf_admin_sms_return]))
        $hps = explode("\n", $mw_cash[cf_admin_sms_return]);
        mw_cash_sms_send($hps, $mw_cash[cf_sms_return], $msg);
    }

    return true;
}

// 멤버쉽 안내멘트
function mw_cash_alert_membership($membership_list)
{
    global $g4, $mw_cash, $bo_table, $mw_basic, $no, $wr_id, $member;

    set_session("download_membership", "$bo_table@$wr_id@$no");
    set_session("download_membership_popup", $mw_basic[cf_download_popup]);

    delete_point($member[mb_id], $bo_table, $wr_id, "읽기");

    include_once("$g4[path]/head.sub.php");
    echo "<script type='text/javascript' src='$mw_cash[path]/cybercash.js'></script>
        <script type='text/javascript'>
        var mw_cash_path = '$mw_cash[path]';
        var cf_download_popup = '$mw_basic[cf_download_popup]';

        if (confirm('$membership_list 회원만 이용 가능합니다.\\n\\n신청하시겠습니까?')) {
            buy_membership('$bo_table', $mw_basic[cf_download_popup]);
            if (!cf_download_popup && win_membership)
                history.back();
            else
                document.write(\"<table width='100%' height='100%'><tr><td align='center'><h1>팝업 차단을 해제해주세요.</h1><input type='button' value='뒤로가기' onclick='history.back()'></td></tr></table>\");
        }
        else {
            history.back();
        }
        </script>";
    include_once("$g4[path]/tail.sub.php");
    exit;
}

// 멤버쉽 권한 
function mw_cash_is_membership($mb_id, $bo_table, $act='') {
    global $g4, $mw_cash;

    $ms_id = array();
    $ms_name = array();
    $is_membership = "";

    $sql = "select * from $mw_cash[membership_board_table] where bo_table = '$bo_table'";
    if ($act)
        $sql .= " and $act = '1'";

    $qry = sql_query($sql, false);
    while ($row = sql_fetch_array($qry)) {
        $sql2 = "select * from $mw_cash[membership_table] where ms_id = '$row[ms_id]'";
        $row2 = sql_fetch($sql2);

        $ms_name[] = $row2[ms_name];
        $ms_id[] = $row2[ms_id];
    }

    if (!sizeof($ms_id)) return "no";

    for ($i=0, $m=sizeof($ms_id); $i<$m; $i++) {
        $sql = "select ml_id from $mw_cash[membership_log_table]
                    where ms_id = '{$ms_id[$i]}' and mb_id = '$mb_id' and '$g4[time_ymdhis]' between ml_sdate and ml_edate";
        $row = sql_fetch($sql);
        if ($row) {
            $is_membership = "ok";
            break;
        }
    }

    if ($is_membership != "ok")
        $is_membership = implode(", ", $ms_name);

    return $is_membership;
}

// 멤버쉽 종료날짜
function mw_cash_membership_end_date($bo_table, $mb_id) {
    global $g4, $mw_cash;

    $ml_edate = "";
    $mb_id = trim($mb_id);

    $sql = "select * from $mw_cash[membership_board_table] where bo_table = '$bo_table'";
    $qry = sql_query($sql);
    while ($row = sql_fetch_array($qry)) {
        $sql2 = "select max(ml_edate) as ml_edate from $mw_cash[membership_log_table]
                    where ms_id = '$row[ms_id]' and mb_id = '$mb_id' and '$g4[time_ymdhis]' <= ml_edate";
        $row2 = sql_fetch($sql2);
        if ($row2[ml_edate])
            $ml_edate = $row2[ml_edate];
    }
    return $ml_edate;
}

function mw_cash_sms_send($hps, $callback, $msg)
{
    global $g4, $mw_cash;
    @include_once("$g4[path]/lib/etc.lib.php");

    $icode_id = $mw_cash[cf_icode_id];
    $icode_pw = $mw_cash[cf_icode_pw];

    $strDest = array();

    if (is_array($hps)) {
        for ($i=0; $i<count($hps); $i++) {
            $hp = mw_cash_get_hp($hps[$i], 0);
            if (trim($hp)) {
                $strDest[] = $hp;
            }
        }
    }
    else
        $strDest[] = mw_cash_get_hp($hps, 0);


    if ($callback != "0000")
        $callback = mw_cash_get_hp($callback, 0);

    $strCallBack = $callback;

    $strData = $msg;

    $socket_host = "211.172.232.124";
    $port_setting = 1;

    // SMS 모듈 클래스 생성
    $SMS = new mwCashSMS;
    $SMS->SMS_con($socket_host,$icode_id,$icode_pw,$port_setting);

    // 발송번호 목록을 가져옵니다.
    //$strDest = explode(";",$strTelList); // 발송번호 목록
    $nCount = count($strDest); // 발송번호 수

    // 예약설정을 합니다.
    if ($chkSendFlag) {
        $strDate = $R_YEAR.$R_MONTH.$R_DAY.$R_HOUR.$R_MIN;
    } else {
        $strDate = "";
    }

    // 발송하기위해 패킷을 정의합니다.
    $result = $SMS->Add($strDest, $strCallBack, $strCaller, $strURL, set_euckr($strData), $strDate, $nCount);

    // 패킷 정의의 결과에 따라 발송여부를 결정합니다.
    if ($result) {
        $log = "-----------------------\n";
        $log .= "$g4[time_ymdhis] : 일반메시지 입력 성공\n";
        // 패킷이 정상적이라면 발송에 시도합니다.
        $result = $SMS->Send();
        if ($result) {
            $log .= "SMS 서버에 접속했습니다.\n";
            $success = $fail = 0;
            foreach($SMS->Result as $result) {
                list($phone,$code)=explode(":",$result);
                if (substr($code,0,5)=="Error") {
                    $log .= "{$phone}로 발송하는데 에러가 발생했습니다.\n";
                    switch (substr($code,6,2)) {
                        case '02':	 // "02:형식오류"
                            $log .= "형식이 잘못되어 전송이 실패하였습니다.\n";
                            break;
                        case '23':	 // "23:인증실패,데이터오류,전송날짜오류"
                            $log .= "데이터를 다시 확인해 주시기바랍니다.\n";
                            break;
                        case '97':	 // "97:잔여코인부족"
                            $log .= "잔여코인이 부족합니다.\n";
                            break;
                        case '98':	 // "98:사용기간만료"
                            $log .= "사용기간이 만료되었습니다.\n";
                            break;
                        case '99':	 // "99:인증실패"
                            $log .= "인증 받지 못하였습니다. 계정을 다시 확인해 주세요.\n";
                            break;
                        default:	 // "미 확인 오류"
                            $log .= "알 수 없는 오류로 전송이 실패하었습니다.\n";
                            break;
                    }
                    $fail++;
                } else {
                    $log .= $phone."로 전송했습니다. (메시지번호:".$code.")\n";
                    $success++;
                }
            }
            $log .= $success."건을 전송했으며 ".$fail."건을 보내지 못했습니다.\n";
            $SMS->Init(); // 보관하고 있던 결과값을 지웁니다.
        }
        else $log .= "에러: SMS 서버와 통신이 불안정합니다.\n";
    }
    
    $log_file = "$g4[path]/data/log/mw.cash.sms.".date("ym", $g4['server_time']);
    write_log($log_file, $log);
}


// 핸드폰번호 형식으로 return
function mw_cash_get_hp($hp, $hyphen=1)
{
    if (!mw_cash_is_hp($hp)) return '';

    if ($hyphen) $preg = "$1-$2-$3"; else $preg = "$1$2$3";

    $hp = str_replace('-', '', trim($hp));
    $hp = preg_replace("/^(01[016789])([0-9]{3,4})([0-9]{4})$/", $preg, $hp);

    return $hp;
}

// 핸드폰번호 여부
function mw_cash_is_hp($hp)
{
    $hp = str_replace('-', '', trim($hp));
    if (preg_match("/^(01[016789])([0-9]{3,4})([0-9]{4})$/", $hp))
        return true;
    else
        return false;
}

/**
 * ICODEKOREA.COM 모듈
 *
 * SMS 발송을 관장하는 메인 클래스이다.
 *
 * 접속, 발송, URL발송, 결과등의 실질적으로 쓰이는 모든 부분이 포함되어 있다.
 */
class mwCashSMS {
	var $icode_id;
	var $icode_pw;
	var $socket_host;
	var $socket_port;
	var $Data = array();
	var $Result = array();

	// 접속을 위해 사용하는 변수를 정리한다.
	function SMS_con($host,$id,$pw,$portcode) {
		if ($portcode == 1) {
			$port=(int)rand(7192,7195);
		} else {
			$port=(int)rand(7196,7199);
		}

		$this->socket_host	= $host;
		$this->socket_port	= $port;
		$this->icode_id		= mwCashFillSpace($id, 10);
		$this->icode_pw		= mwCashFillSpace($pw, 10);
	}

	function Init() {
		$this->Data		= "";	// 발송하기 위한 패킷내용이 배열로 들어간다.
		$this->Result	= "";	// 발송결과값이 배열로 들어간다.
	}

	function Add($strDest, $strCallBack, $strCaller, $strURL, $strData, $strDate="", $nCount) {
		$Error = mwCashCheckCommonTypeDest($strDest, $nCount);
		$Error = mwCashCheckCommonTypeCallBack($strCallBack);
		$Error = mwCashCheckCommonTypeDate($strDate);

		$strCallBack	= mwCashFillSpace($strCallBack,11);
		$strCaller		= mwCashFillSpace($strCaller,10);
		$strDate		= mwCashFillSpace($strDate,12);

		for ($i=0; $i<$nCount; $i++) {
			$strDest[$i]	= mwCashFillSpace($strDest[$i],11);

			if (!$strURL) {
				$strData	= mwCashFillSpace(mwCashCutChar($strData,80),80);

				$this->Data[$i]	= '01144 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strCaller.$strDate.$strData;
			} else {
				$strURL		= mwCashFillSpace($strURL,50);
				$strData	= mwCashFillSpace(mwCashCheckCallCenter($strURL, $strDest[$i], $strData),80);

				$this->Data[$i]	= '05173 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strURL.$strDate.$strData;
			}
		}
		return true; // 수정대기
	}

	function Send() {
		$fsocket=fsockopen($this->socket_host,$this->socket_port);
		if (!$fsocket) return false;
		set_time_limit(300);

		## php4.3.10일경우
        ## zend 최신버전으로 업해주세요..
        ## 또는 69번째 줄을 $this->Data as $tmp => $puts 로 변경해 주세요.

		foreach($this->Data as $puts) {
			$dest = substr($puts,26,11);
			fputs($fsocket, $puts);
			while(!$gets) {
				$gets = fgets($fsocket,30);
			}
			if (substr($gets,0,19) == "0223  00".$dest)
				$this->Result[] = $dest.":".substr($gets,19,10);
			else
				$this->Result[$dest] = $dest.":Error(".substr($gets,6,2).")";
			$gets = "";
		}
		fclose($fsocket);
		$this->Data = "";
		return true;
	}
}

/**
 * 원하는 문자열의 길이를 원하는 길이만큼 공백을 넣어 맞추도록 합니다.
 *
 * @param	text	원하는 문자열입니다.
 *			size	원하는 길이입니다.
 * @return			변경된 문자열을 넘깁니다.
 */
function mwCashFillSpace($text,$size) {
	for ($i=0; $i<$size; $i++) $text.=" ";
	$text = substr($text,0,$size);
	return $text;
}


/**
 * 원하는 문자열을 원하는 길에 맞는지 확인해서 조정하는 기능을 합니다.
 *
 * @param	word	원하는 문자열입니다.
 *			cut		원하는 길이입니다.
 * @return			변경된 문자열입니다.
 */
function mwCashCutChar($word, $cut) {
	$word=substr($word,0,$cut);						// 필요한 길이만큼 취함.
	for ($k=$cut-1; $k>1; $k--) {
		if (ord(substr($word,$k,1))<128) break;		// 한글값은 160 이상.
	}
	$word=substr($word,0,$cut-($cut-$k+1)%2);
	return $word;
}


/**
 * 발송번호의 값이 정확한 값인지 확인합니다.
 *
 * @param	strDest	발송번호 배열입니다.
 *			nCount	배열의 크기입니다.
 * @return			처리결과입니다.
 */
function mwCashCheckCommonTypeDest($strDest, $nCount) {
	for ($i=0; $i<$nCount; $i++) {
		$strDest[$i]=preg_replace("/[^0-9]/i","",$strDest[$i]);
		if (strlen($strDest[$i])<10 || strlen($strDest[$i])>11) return "휴대폰 번호가 틀렸습니다";

		$CID=substr($strDest[$i],0,3);
		if ( preg_match("/[^0-9]/i",$CID) || ($CID!='010' && $CID!='011' && $CID!='016' && $CID!='017' && $CID!='018' && $CID!='019') ) return "휴대폰 앞자리 번호가 잘못되었습니다";
	}
}


/**
 * 회신번호의 값이 정확한 값인지 확인합니다.
 *
 * @param	strDest	회신번호입니다.
 * @return			처리결과입니다.
 */
function mwCashCheckCommonTypeCallBack($strCallBack) {
	if (preg_match("/[^0-9]/i", $strCallBack)) return "회신 전화번호가 잘못되었습니다";
}


/**
 * 예약날짜의 값이 정확한 값인지 확인합니다.
 *
 * @param	text	원하는 문자열입니다.
 *			size	원하는 길이입니다.
 * @return			처리결과입니다.
 */
function mwCashCheckCommonTypeDate($strDate) {
	$strDate=preg_replace("/[^0-9]/i","",$strDate);
	if ($strDate) {
		if (!checkdate(substr($strDate,4,2),substr($strDate,6,2),substr($rsvTime,0,4))) return "예약날짜가 잘못되었습니다";
		if (substr($strDate,8,2)>23 || substr($strDate,10,2)>59) return "예약시간이 잘못되었습니다";
	}
}


/**
 * URL콜백용으로 메세지 크기를 수정합니다.
 *
 * @param	url		URL 내용입니다.
 *			msg		결과메시지입니다.
 *			desk	문자내용입니다.
 */
function mwCashCheckCallCenter($url, $dest, $data) {
	switch (substr($dest,0,3)) {
		case '010': //20바이트
			return mwCashCutChar($data,20);
			break;
		case '011': //80바이트
			return mwCashCutChar($data,80);
			break;
		case '016': // 80바이트
			return mwCashCutChar($data,80);
			break;
		case '017': // URL 포함 80바이트
			return mwCashCutChar($data,80 - strlen($url));
			break;
		case '018': // 20바이트
			return mwCashCutChar($data,20);
			break;
		case '019': // 20바이트
			return mwCashCutChar($data,20);
			break;
		default:
			return mwCashCutChar($data,80);
			break;
	}
}
/*
-----------------------------------------------------------
    euckr -> utf8 .. 080324, 최재영
-----------------------------------------------------------
*/
if (!function_exists('set_utf8')) {
function set_utf8($str)
{
    if (!is_utf8($str))
        $str = convert_charset('cp949', 'utf-8', $str);

    $str = trim($str);

    return $str;
}}

/*
-----------------------------------------------------------
    utf8 -> euckr .. 080324, 최재영
-----------------------------------------------------------
*/
if (!function_exists('set_euckr')) {
function set_euckr($str)
{
    if (is_utf8($str))
        $str = convert_charset('utf-8', 'cp949', $str);

    $str = trim($str);

    return $str;
}}

/*
-----------------------------------------------------------
    Charset 을 변환하는 함수 .. 080324, 최재영
-----------------------------------------------------------
*/
if (!function_exists('convert_charset')) {
function convert_charset($from_charset, $to_charset, $str) {
    if( function_exists('iconv') )
        return iconv($from_charset, $to_charset, $str);
    elseif( function_exists('mb_convert_encoding') )
        return mb_convert_encoding($str, $to_charset, $from_charset);
    else
        die("Not found 'iconv' or 'mbstring' library in server.");
}}

/*
-----------------------------------------------------------
    텍스트가 utf-8 인지 검사하는 함수 .. 080324, 최재영
-----------------------------------------------------------
*/
if (!function_exists('is_utf8')) {
function is_utf8($string) {

  // From http://w3.org/International/questions/qa-forms-utf-8.html
  return preg_match('%^(?:
        [\x09\x0A\x0D\x20-\x7E]            # ASCII
      | [\xC2-\xDF][\x80-\xBF]            # non-overlong 2-byte
      |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
      | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
      |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
      |  \xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
      | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
      |  \xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
 )*$%xs', $string);
}}

function mw_cash_is_korea($ip='')
{
    global $g4;

    $kor = array();
    $kor[] = "krnic";
    $kor[] = "korea";
    //$kor[] = "한국";

    if (!$ip)
        $ip = $_SERVER[REMOTE_ADDR];

    $fp = @fsockopen("whois.nic.or.kr", 43, $errno, $errstr, 5);
    if(!$fp) return "do not know";

    fputs($fp,"$ip\n");
    while (!feof($fp)) {
        $row = @fgets($fp, 80);
        if (!preg_match("/^utf/i", $g4[charset])) {
            $row = iconv("utf-8", "cp949", $row);
        }
        for ($i=0, $m=count($kor); $i<$m; $i++) {
            if (preg_match("/{$kor[$i]}/i", $row)) {
                fclose($fp);
                return 1;
            }
        }
    }
    fclose($fp);

    return false;
}

function mw_cash_grade($mb_id, $cl_id=0)
{
    global $g4, $mw_cash;

    $sql = "select * from {$mw_cash['grade_table']} where gd_use = '1' order by gd_cash desc, gd_period*-1 desc, gd_point_save desc";
    $qry = sql_query($sql);
    for ($i=0; $row=sql_fetch_array($qry); $i++)
    {
        $sql = "select r.mb_id, r.gd_cash from ( ";
        $sql.= "select mb_id, sum(cl_cash) as gd_cash ";
        $sql.= "  from {$mw_cash['cash_list_table']} ";
        $sql.= " where cl_status = '1' ";
        $sql.= "   and (cl_paytype <> '' and cl_paytype <> '서비스' and cl_paytype <> '포인트')";
        $sql.= "   and cl_cash > 0 and cl_payment > 0";
        if ($row['gd_period']) {
            $begin = date("Y-m-d 00:00:00", strtotime("-{$row['gd_period']} day", $g4['server_time']));
            $limit = date("Y-m-d 23:59:59", $g4['server_time']);
            $sql.= " and cl_datetime between '{$begin}' and '{$limit}' ";
        }
        $sql.= "   and mb_id = '{$mb_id}' ";
        if ($cl_id)
            $sql.= " and cl_id <> '{$cl_id}' ";
        $sql.= " group by mb_id ";
        $sql_tmp = "$sql ) as r ";
        if ($old['gd_cash'])
            $sql.= " ) as r where r.gd_cash >= '{$row['gd_cash']}' and r.gd_cash < '{$old['gd_cash']}'  ";
        else
            $sql.= " ) as r where r.gd_cash >= '{$row['gd_cash']}'  ";
        $row2 = sql_fetch($sql);

        $next = $old;

        if ($row['gd_use']) {
            $fr_cash = round($row['gd_cash']);
            $to_cash = round($old['gd_cash']);
            $old = $row;
        }
        else {
            $fr_cash = round($row['gd_cash']);
            $to_cash = '';
        }

        if ($row2) break;
    }
    if (!$row) return;

    if (!$row2)
        $next = $old;

    $row3 = sql_fetch($sql_tmp);

    $row['my_charge'] = $row3['gd_cash'];
    $row['next'] = $next;

    return $row;
}


